package main

import "fmt"

/*
  1. 数组：是同一种数据类型的固定长度的序列。
    2. 数组定义：var a [len]int，比如：var a [5]int，数组长度必须是常量，且是类型的组成部分。一旦定义，长度不能变。
    3. 长度是数组类型的一部分，因此，var a[5] int和var a[10]int是不同的类型。
    4. 数组可以通过下标进行访问，下标是从0开始，最后一个元素下标是：len-1
    for i := 0; i < len(a); i++ {
    }
    for index, v := range a {
    }
    5. 访问越界，如果下标在数组合法范围之外，则触发访问越界，会panic
    6. 数组是值类型，赋值和传参会复制整个数组，而不是指针。因此改变副本的值，不会改变本身的值。
    7.支持 "=="、"!=" 操作符，因为内存总是被初始化过的。
    8.指针数组 [n]*T，数组指针 *[n]T。
 */
func main() {

	test2()
}

func test2()  {
	arr1 := make([]int, 5)
	printArr(arr1)

	fmt.Println(arr1)

	arr2 := make([]int, 15)
	arr2[0] = 100
	printArr(arr2)
	fmt.Println(arr2)
}

func printArr(arr []int)  {
	arr[0] = 100
	for key, value := range arr {
		fmt.Println(key, value)
	}
}

//多维数组遍历：
func duoweiArray()  {
	var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}

	for k1, v1 := range f {
		for k2, v2 := range v1 {
			fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
		}
		fmt.Println()
	}
}

/*
	值拷贝行为会造成性能问题，通常会建议使用 slice，或数组指针。
    参考 1 2 3 6
 */
func arrayTest()  {
	a := [2]int{}

	fmt.Println(len(a), cap(a))
	fmt.Printf("a : %p \n", &a)

	copyTest(a)
	fmt.Println(a)
}


func copyTest(x [2]int)  {
	fmt.Printf("x : %p \n", &x)
	x[1] = 10000
}
